﻿// Inner Fire 游戏引擎库
// ShaderCache - 着色器缓存
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 用于保存编译之后的Shader。以免每次都重新编译。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-07-08

#pragma once

#include <chrono>
#include <dx/core/dx_core.h>
#include <d3dcompiler.h>
#include <filesystem>
#include <string>

namespace fs = std::filesystem;

namespace ifire::dx{

class ShaderCache {
public:
  // 初始化缓存目录
  static void Initialize(const std::wstring& cacheDir = L"shader_cache");

  // 编译或加载缓存的Shader
  static ComPtr<ID3DBlob> CompileOrLoad(const std::string& filename,
      const D3D_SHADER_MACRO* defines, const std::string& entry_point,
      const std::string& target, bool forceRecompile = false);

  // 清除所有缓存
  static void ClearCache();

private:
  // 生成缓存文件名
  static fs::path GetCacheFilePath(const std::string& filename,
      const D3D_SHADER_MACRO* defines, const std::string& entry_point,
      const std::string& target);

  // 计算定义列表的哈希值
  static size_t CalculateDefinesHash(const D3D_SHADER_MACRO* defines);

  // 检查缓存是否有效（源文件是否比缓存文件新）
  static bool IsCacheValid(
      const fs::path& cachePath, const fs::path& sourcePath);

  // 缓存目录路径
  static fs::path s_cacheDir;
};

}